#include <iostream>
#include <json/json.h>  // JsonCpp 头文件

int main() {
    // 测试1：验证头文件和库是否能正常引用
    std::cout << "=== 测试1：库引用验证 ===" << std::endl;
    std::cout << "JsonCpp 头文件引用成功" << std::endl;

    // 测试2：创建JSON对象并序列化
    std::cout << "\n=== 测试2：JSON序列化 ===" << std::endl;
    Json::Value root;
    root["name"] = "JsonCpp Test";
    root["version"] = 1.9;
    root["is_valid"] = true;
    
    Json::Value array;
    array.append("read");
    array.append("write");
    root["features"] = array;

    // 序列化为字符串（带缩进）
    Json::StreamWriterBuilder writerBuilder;
    writerBuilder["indentation"] = "  ";  // 缩进2个空格
    std::unique_ptr<Json::StreamWriter> writer(writerBuilder.newStreamWriter());
    std::string jsonStr;
    std::ostringstream oss;
    writer->write(root, &oss);
    jsonStr = oss.str();
    std::cout << "生成的JSON:\n" << jsonStr << std::endl;

    // 测试3：解析JSON字符串
    std::cout << "\n=== 测试3：JSON解析 ===" << std::endl;
    Json::CharReaderBuilder readerBuilder;
    std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
    Json::Value parsedRoot;
    std::string errors;

    bool parseSuccess = reader->parse(
        jsonStr.c_str(), 
        jsonStr.c_str() + jsonStr.size(), 
        &parsedRoot, 
        &errors
    );

    if (!parseSuccess) {
        std::cerr << "JSON解析失败: " << errors << std::endl;
        return 1;
    }

    // 提取解析后的数据
    std::cout << "解析结果:\n";
    std::cout << "name: " << parsedRoot["name"].asString() << "\n";
    std::cout << "version: " << parsedRoot["version"].asDouble() << "\n";
    std::cout << "is_valid: " << (parsedRoot["is_valid"].asBool() ? "true" : "false") << "\n";
    std::cout << "features: ";
    for (const auto& feature : parsedRoot["features"]) {
        std::cout << feature.asString() << " ";
    }
    std::cout << std::endl;

    // 测试4：验证库版本（JsonCpp 1.9.4+ 支持）
    std::cout << "\n=== 测试4：版本验证 ===" << std::endl;
    std::cout << "JsonCpp 版本: " << JSONCPP_VERSION_STRING << std::endl;

    std::cout << "\n=== 所有测试通过！JsonCpp 安装正常 ===" << std::endl;
    return 0;
}
